/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/

#ifndef SERVER_H
#define SERVER_H

#include "socket.h"
#include "parser.h"

#include <pthread.h>
#include <time.h>

#define BACKLOG	5 // TO DO: fundamentar sobre o tamanho ideal do BACKLOG
#define TIMEOUT 3

/*
	Preenche o hints com informações locais;
	Efetua o loockup através do getaddrinfo;
	Abre o socket com as informações obtidas pelo lookup;
	Caso lg_reuseaddr = true, solicita ao SO o reúso do socket;
	Efetua o bind e retorna o socket fd;
*/
int srv_getboundsockfd(struct addrinfo *srv,vstring *port,int lg_reuseaddr);


/*
	Solicita para o SO o listen do socket descrito cujo fd passado foi por parâmetro,
	inicia o listen que aceita 'backlog' conexões na fila.
	Efetua verificação de erro.
	@param int sockfd: fd do socket reponsável por ouvir as conexões
	@param int backlog: número máximo de conexões na fila
*/
int srv_listen(int, int);

/**
 * Cria uma conexão com um servidor
 * @param url Endereço do Servidor
 * @param service Porta ou Serviço a se conectar no servidor, ex.: "80", "http"
 * @param output_error Variável de saída, para ser armazenada uma mensagem em
 *          caso de erro.
 * @return Socket Descriptor da conexão
 */
int srv_connect(vstring *url,vstring *service,vstring *output_error,struct addrinfo **servinfo);

/******** connection_handle() *********************
 Deverá existir uma instância separada desta função
 para cada conexão. Ela trata toda a comunicação
 uma vez que uma conexão tenha sido estabelecida
	Utilizado tanto no servidor multi-processo
	quanto no servidor mult-thread
 *****************************************/
void connection_handle(int);

void server_recv(int, header_data **);

void server_pass(int serv_sock,header_data **hd);

int recvtimeout(int s,vstring **buf,int timeout);

void concat_response(header_data **hd,int sock,int *last_irc,char **buf,char **msg);

#endif
